1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
#![allow(non_camel_case_types, non_snake_case)]
use crate::decl::*;
use crate::kernel::ffi_types::*;
use crate::ole::privs::*;
use crate::prelude::*;
use crate::shell::iterators::*;
use crate::vt::*;
/// [`IShellItemArray`](crate::IShellItemArray) virtual table.
#[repr(C)]
pub struct IShellItemArrayVT {
pub IUnknownVT: IUnknownVT,
pub BindToHandler: fn(COMPTR, PVOID, PCVOID, PCVOID, *mut COMPTR) -> HRES,
pub GetPropertyStore: fn(COMPTR, u32, PCVOID, *mut COMPTR) -> HRES,
pub GetPropertyDescriptionList: fn(COMPTR, PVOID, PCVOID, *mut COMPTR) -> HRES,
pub GetAttributes: fn(COMPTR, u32, u32, PVOID) -> HRES,
pub GetCount: fn(COMPTR, *mut u32) -> HRES,
pub GetItemAt: fn(COMPTR, u32, *mut COMPTR) -> HRES,
pub EnumItems: fn(COMPTR, *mut PVOID) -> HRES,
}
com_interface! { IShellItemArray: "b63ea76d-1f85-456f-a19c-48159efa858b";
/// [`IShellItemArray`](https://learn.microsoft.com/en-us/windows/win32/api/shobjidl_core/nn-shobjidl_core-ishellitemarray)
/// COM interface over [`IShellItemArrayVT`](crate::vt::IShellItemArrayVT).
///
/// Automatically calls
/// [`IUnknown::Release`](https://learn.microsoft.com/en-us/windows/win32/api/unknwn/nf-unknwn-iunknown-release)
/// when the object goes out of scope.
}
impl shell_IShellItemArray for IShellItemArray {}
/// This trait is enabled with the `shell` feature, and provides methods for
/// [`IShellItemArray`](crate::IShellItemArray).
///
/// Prefer importing this trait through the prelude:
///
/// ```no_run
/// use winsafe::prelude::*;
/// ```
pub trait shell_IShellItemArray: ole_IUnknown {
/// Returns an iterator over the [`IShellItem`](crate::IShellItem) elements
/// by calling
/// [`IShellItemArray::GetCount`](crate::prelude::shell_IShellItemArray::GetCount)
/// and
/// [`IShellItemArray::GetItemAt`](crate::prelude::shell_IShellItemArray::GetItemAt)
/// consecutively.
///
/// # Examples
///
/// Iterating over the [`IShellItem`](crate::IShellItem) objects:
///
/// ```no_run
/// use winsafe::{self as w, prelude::*, co};
///
/// let ish_arr: w::IShellItemArray; // initialized somewhere
/// # let ish_arr = unsafe { w::IShellItemArray::null() };
///
/// for ish_item in ish_arr.iter()? {
/// let ish_item = ish_item?;
/// println!("Path: {}",
/// ish_item.GetDisplayName(co::SIGDN::FILESYSPATH)?);
/// }
/// # w::HrResult::Ok(())
/// ```
///
/// Collecting the file paths into a [`Vec`](std::vec::Vec):
///
/// ```no_run
/// use winsafe::{self as w, prelude::*, co};
///
/// let ish_arr: w::IShellItemArray; // initialized somewhere
/// # let ish_arr = unsafe { w::IShellItemArray::null() };
///
/// let paths = ish_arr.iter()?
/// .map(|shi| {
/// let shi = shi?;
/// let name = shi.GetDisplayName(co::SIGDN::FILESYSPATH)?;
/// Ok(name)
/// })
/// .collect::<w::HrResult<Vec<_>>>()?;
/// # w::HrResult::Ok(())
/// ```
#[must_use]
fn iter(&self,
) -> HrResult<impl Iterator<Item = HrResult<IShellItem>> + '_>
{
Ok(IshellitemarrayIter::new(self)?)
}
/// [`IShellItemArray::GetCount`](https://learn.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-ishellitemarray-getcount)
/// method.
#[must_use]
fn GetCount(&self) -> HrResult<u32> {
let mut count = u32::default();
ok_to_hrresult(
unsafe {
(vt::<IShellItemArrayVT>(self).GetCount)(self.ptr(), &mut count)
},
).map(|_| count)
}
/// [`IShellItemArray::GetItemAt`](https://learn.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-ishellitemarray-getitemat)
/// method.
///
/// Prefer using
/// [`IShellItemArrayT::iter`](crate::prelude::shell_IShellItemArray::iter).
#[must_use]
fn GetItemAt(&self, index: u32) -> HrResult<IShellItem> {
let mut queried = unsafe { IShellItem::null() };
ok_to_hrresult(
unsafe {
(vt::<IShellItemArrayVT>(self).GetItemAt)(
self.ptr(),
index,
queried.as_mut(),
)
},
).map(|_| queried)
}
}